home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / t3_1 / risc_src.lha / risc_sources / scheme / runtime.t < prev    next >
Text File  |  1990-07-10  |  14KB  |  539 lines

  1. (herald runtime (env tsys))
  2.  
  3. ;;; Copyright (c) 1985, 1988 Yale University
  4. ;;;     Authors: N Adams, R Kelsey, D Kranz, J Philbin, K Pitman, J Rees.
  5. ;;; This material was developed by the T Project at the Yale University Computer
  6. ;;; Science Department.  Permission to copy this software, to redistribute it,
  7. ;;; and to use it for any purpose is granted, subject to the following restric-
  8. ;;; tions and understandings.
  9. ;;; 1. Any copy made of this software must include this copyright notice in full.
  10. ;;; 2. Users of this software agree to make their best efforts (a) to return
  11. ;;;    to the T Project at Yale any improvements or extensions that they make,
  12. ;;;    so that these may be included in future releases; and (b) to inform
  13. ;;;    the T Project of noteworthy uses of this software.
  14. ;;; 3. All materials developed as a consequence of the use of this software
  15. ;;;    shall duly acknowledge such use, in accordance with the usual standards
  16. ;;;    of acknowledging credit in academic research.
  17. ;;; 4. Yale has made no warranty or representation that the operation of
  18. ;;;    this software will be error-free, and Yale is under no obligation to
  19. ;;;    provide any services, by way of maintenance, update, or otherwise.
  20. ;;; 5. In conjunction with products arising from the use of this material,
  21. ;;;    there shall be no use of the name of the Yale University nor of any
  22. ;;;    adaptation thereof in any advertising, promotional, or sales literature
  23. ;;;    without prior written consent from Yale in each case.
  24. ;;;
  25.  
  26. ;;; Modified by Ashwin Ram, July 1985
  27.  
  28. ;;; Compilation support environment for Scheme picks up integrable
  29. ;;; procedure definitions made in this file.
  30.  
  31. (define-constant (string-set! string n char)
  32.    (set (string-elt string n) char))
  33.  
  34. (define-constant (set-car! x y)
  35.    (set (car x) y))
  36.  
  37. (define-constant (set-cdr! x y)
  38.    (set (cdr x) y))
  39.  
  40. ;;; Define Scheme's READ in terms of T's, etc.
  41.  
  42. (define-local-syntax (define-scheme pat . body)
  43.    (let ((foo (lambda (name val)
  44.                  `(*define scheme-env ',name ,val))))
  45.       (cond ((atom? pat)
  46.              (foo pat (car body)))
  47.             (else
  48.              (foo (car pat)
  49.                   `(named-lambda ,(car pat) ,(cdr pat) . ,body))))))
  50.  
  51. (define-scheme (head stream) (car stream))
  52. (define-scheme (tail stream) (force (cdr stream)))
  53. (define-scheme (empty-stream? stream) (null? stream))
  54.  
  55. (define-scheme user-initial-environment scheme-env)
  56.  
  57. (define-scheme (error . items)
  58.    (apply error
  59.           (apply string-append
  60.                  "~a"
  61.                  (map (always "~%~10t~s") (cdr items)))
  62.           items))
  63.  
  64. (define-scheme (explode atom)
  65.    (map! (lambda (char) (string->symbol (char->string char)))
  66.          (string->list (symbol->string (enforce symbol? atom)))))
  67.  
  68. (define-scheme (implode list)
  69.    (string->symbol (list->string (map (compose char symbol->string) list))))
  70.  
  71. (define-local-syntax (optional r specs . body)
  72.    (cond ((null? specs) `(block ,@body))
  73.          (else
  74.           (let ((spec (car specs))
  75.                 (specs (cdr specs))
  76.                 (var (generate-symbol 'rest)))
  77.              `(let* ((,var ,r)
  78.                      (,(car spec)
  79.                       (cond ((null? ,var) ,(or (cadr spec) 'nil))
  80.                             (else (car ,var)))))
  81.                  (optional (cdr ,var) ,specs ,@body))))))
  82.  
  83. (define-scheme (read . r)
  84.    (optional r ((port (standard-input)))
  85.       (read port)))
  86.  
  87. (define-scheme (read-char . r)                       ;; for RRRS
  88.    (optional r ((port (standard-input)))
  89.       (read-char port)))
  90.  
  91. (define-scheme (char-ready? . r)                       ;; for RRRS
  92.    (optional r ((port (standard-input)))
  93.       (char-ready? port)))
  94.  
  95. (define-scheme (newline . r)
  96.    (optional r ((port (standard-output)))
  97.       (newline port)
  98.       t))
  99.  
  100. (define-scheme (write-char c . r)                    ;; for RRRS
  101.    (optional r ((port (standard-output)))
  102.       (write-char port c)
  103.       t))
  104.  
  105. (define-scheme (princ thing . r)
  106.    (optional r ((port (standard-output)))
  107.       (display thing port)
  108.       t))
  109.  
  110. (*define scheme-env 'display (*value scheme-env 'princ))
  111.  
  112. (define-scheme (prin1 thing . r)
  113.    (optional r ((port (standard-output)))
  114.       (print thing port)
  115.       t))
  116.  
  117. (*define scheme-env 'write   (*value scheme-env 'prin1))
  118.  
  119. (define-scheme (print thing . r)
  120.    (optional r ((port (standard-output)))
  121.       (format port "~&~S~&" thing)                   ;; Sort of.
  122.       t))
  123.  
  124. (define-scheme (call-with-input-file spec proc)
  125.    (with-open-ports ((port (open spec '(in))))
  126.       (proc port)))
  127.  
  128. (define-scheme (call-with-output-file spec proc)
  129.    (with-open-ports ((port (open spec '(out))))
  130.       (proc port)))
  131.  
  132. (define scheme-eqv? equiv?)        ;; Sort of
  133.  
  134. ;;; Close to JAR's scheme equal?.
  135. (define (scheme-equal? obj1 obj2)
  136.   (iterate equal? ((obj1 obj1) (obj2 obj2))
  137.     (cond ((scheme-eqv? obj1 obj2))
  138.       ((pair? obj1)
  139.        (and (pair? obj2)
  140.         (equal? (car obj1) (car obj2))
  141.         (equal? (cdr obj1) (cdr obj2))))
  142.       ((string? obj1)
  143.        (and (string? obj2)
  144.         (string-equal? obj1 obj2)))
  145.       (else
  146.        (and (vector? obj1)
  147.         (vector? obj2)
  148.         (let ((z (vector-length obj1)))
  149.           (and (fx= z (vector-length obj2))
  150.                (iterate loop ((i 0))
  151.                 (or (fx= i z)
  152.                     (and (equal? (vector-elt obj1 i)
  153.                          (vector-elt obj2 i))
  154.                      (loop (fx+ i 1))))))))))))
  155.  
  156. (define-scheme (memv x l)
  157.    (mem scheme-eqv? x l))
  158.  
  159. (define-scheme (assv x l)
  160.    (ass scheme-eqv? x l))
  161.  
  162. (define-scheme (member x l)
  163.    (mem scheme-equal? x l))
  164.  
  165. (define-scheme (assoc x l)
  166.    (ass scheme-equal? x l))
  167.  
  168. (define-scheme random
  169.   (let ((r (make-random 7)))
  170.     (named-lambda random (n)
  171.       (mod (r) n))))
  172.  
  173. (define-scheme (char-numeric? ch)
  174.   (digit? ch 10))
  175.  
  176. (define-scheme (string-ci=? string1 string2)
  177.   (string-equal? (string-upcase string1) (string-upcase string2)))
  178.  
  179.  
  180. (define-scheme (substring string start end)
  181.   (substring string start (fx+ (fx- end start) 1)))
  182.  
  183. (define-scheme (number->string n f)
  184.   (ignore f)
  185.   (format nil "~s" n))
  186.  
  187. (define-scheme (string->number s)
  188.   (read (string->input-port s)))
  189.  
  190. (define pi 3.141592653589793)
  191. (define pi/2 1.5707963267948966)
  192.  
  193. ;; Different args from T's ATAN.
  194. (define-scheme (atan y . x-option)
  195.   (let ((y (->float y)))
  196.     (if (null? x-option)
  197.     (atan y)
  198.     (let ((x (->float (car x-option))))
  199.       (if (and (fl= x 0.0) (fl= y 0.0))
  200.           (error "arctangent of (0,0)")
  201.           (cond ((fl= y 0.0)
  202.              (if (fl< x 0.0) pi 0.0))
  203.             ((fl= x 0.0)
  204.              (if (fl< y 0.0) (fl- 0.0 pi/2) pi/2))
  205.             ((fl< x 0.0)
  206.              (let ((theta (atan (fl/ y x))))
  207.                (if (fl< y 0.0) (fl- theta pi) (fl+ theta pi))))
  208.             (else (atan (fl/ y x)))))))))
  209.  
  210.  
  211.  
  212. (define-scheme (vector . l)
  213.    (list->vector l))
  214.  
  215. (define-scheme (open-input-file filename)
  216.    (open filename 'in))
  217.  
  218. (define-scheme (open-output-file filename)
  219.    (open filename 'out))
  220.  
  221. (define-scheme (t-top)
  222.    (t-top))
  223.  
  224.  
  225. ;; Need -- 
  226. ;;    round
  227. ;;    rationalize
  228. ;;    make-rectangular
  229. ;;    make-polar
  230. ;;    real-part
  231. ;;    imag-part
  232. ;;    magnitude
  233. ;;    angle
  234. ;;    exact->inexact
  235. ;;    inexact->exact
  236. ;;    string<? ;; and the rest.
  237.  
  238. (define (floor x)
  239.   (if (>= x 0)
  240.       (->integer x)
  241.       (- (ceiling (- x)))))
  242.  
  243. (define (ceiling x)
  244.   (if (>= x 0)
  245.       (if (= x (->integer x))        ;integer?
  246.       x
  247.       (->integer (+ x 1)))
  248.       (- (floor (- x)))))
  249.  
  250. (define (lcm x y)
  251.   (cond ((= x 0) 0)
  252.     ((= y 0) 0)
  253.     (else (* (quotient (abs x) (gcd x y)) (abs y)))))
  254.  
  255. (define-scheme (string . args)
  256.   (list->string args))
  257.  
  258. (define scheme-from-t
  259.       '(else
  260.     true
  261.         string-set!
  262.     set-car!
  263.     set-cdr!  ; what a hack
  264. ;; Primitive procedures (see index to A&S)
  265.  
  266.         procedure?            
  267.         boolean?          
  268.         apply
  269.         atom?
  270.         car cdr caar cadr cdar cddr
  271.         caaar caadr cadar caddr cdaar cdadr cddar cdddr
  272.         caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr
  273.         cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr
  274.         cons
  275.         eq?
  276.         eval
  277.         list
  278.         max min
  279.         not                        ;; cheat
  280.         null?
  281.         number?
  282.         symbol?
  283.         remainder
  284.     quotient
  285.     floor
  286.     ceiling
  287.         + - * /
  288.         = < >
  289.         1+ -1+
  290.    %%add
  291.    %%subtract
  292.    %%multiply
  293.    %%remainder
  294.    %%less?
  295.    %%equal?
  296.  
  297. ;; These things aren't called "primitive," but are used in the
  298. ;; book or problem sets
  299.  
  300.         force
  301.         abs gcd lcm sqrt
  302.         sin cos exp expt
  303.         <= >=
  304. ;;      get put
  305.         assq
  306.         memq
  307.         length
  308.    fx+
  309.    fx-
  310.    fx-and
  311.    fx-ior
  312.    fx-xor
  313.    fx-not
  314.    fx-abs
  315.    fx-negate
  316.    fx-odd?  
  317.    fx-even? 
  318.    fx-bit?  
  319.    fx-ashl  
  320.    fx-ashr  
  321.    fx-ash   
  322.    fx-length
  323.    fx-expt  
  324.    fx-zero? 
  325.    fx*
  326.    fx/ 
  327.    fx=
  328.    fx<
  329.    fx>
  330.    fxn=
  331.    fx>=
  332.    fx<=
  333.    fx-rem
  334.    fl+
  335.    fl-
  336.    fl*
  337.    fl/ 
  338.    fl=
  339.    fl<
  340.    fl>
  341.    fln=
  342.    fl>=
  343.    fl<=
  344.         equal?
  345.         append
  346.         reverse  
  347.         append!  ; needed by expand quasiquote
  348. ;;      reverse!  - ???
  349.         char?
  350.         string->symbol
  351.         symbol->string
  352.         pair?
  353.         integer?
  354.         real?
  355.         rational?
  356.         zero?
  357.         positive?
  358.         negative?
  359.         odd?
  360.         even?
  361.         log
  362.         tan
  363.         asin
  364.         acos
  365. ;;      atan                         ;; Different from T's ATAN.
  366.         char-upcase
  367.         char-downcase
  368.         string?
  369.         string-length
  370.         string-append
  371.         string->list
  372.         list->string
  373.         vector?
  374.         make-vector
  375.         vector-length
  376.         vector->list
  377.         list->vector
  378.         map
  379.         call-with-current-continuation
  380.         input-port?
  381.         output-port?
  382.  
  383. ;; MacScheme has this, so what the heck.
  384.  
  385.         peek-char
  386.  
  387. ;; Macro auxiliaries
  388.     cond-=>-aux
  389.         unbound-label                ;; labels
  390.         cons*                        ;; backquote
  391.         or-aux                       ;; or
  392.         no-more-cond-clauses         ;; cond (?)
  393.         display-traced-objects       ;; trace
  394.         set-traced                   ;; trace
  395.         set-untraced                 ;; untrace
  396.         untrace-traced-objects       ;; untrace
  397.         undefined-value              ;; (?)
  398.         make-delay                   ;; delay
  399.         repl-env                     ;; pp
  400.         *pp                          ;; pp
  401.         *pp-symbol                   ;; pp
  402.         disclose                     ;; pp
  403.         *object                      ;; object (for PP hack)
  404. ;        extend-pointer-elt           ;; object (for PP hack)
  405.         unquote
  406.         unquote-splicing
  407.  
  408.     *define-syntax
  409.     make-macro-descriptor
  410.     setter
  411.     make-locale
  412.     
  413. ;; Other useful stuff for CS221, non-standard but what the heck...
  414.  
  415. ;;      concatenate-symbol           ;; Make them use (string->symbol (string-append (symbol->symbol ...))) instead?
  416. ;;      log
  417.  
  418. ;; Debugging musts, etc.
  419.  
  420.         compile-file
  421.     compile
  422.         load
  423.         exit
  424.         backtrace
  425.         where-defined
  426.         crawl
  427.         debug                        ;; necessary
  428.         repl-results                 ;; for ##
  429.         ret
  430.     eof                ;for eof?
  431.       transcript-on
  432.       transcript-off
  433.       *value
  434.       t-implementation-env           ;; for time macro
  435.       gc
  436.  
  437.        ))
  438.  
  439. ;(walk (lambda (sym)
  440. ;         (*define scheme-env sym (*value scheme-internal-env sym)))
  441. ;      scheme-from-t)
  442.  
  443. (define scheme-aliased-from-t
  444.       '((mapcar map)
  445.         (mapc walk)
  446. ;        (and *and)
  447. ;        (or *or)
  448.         (vector-ref vref)
  449.         (vector-set! vset)
  450.         (vector-fill! vector-fill)
  451.  
  452. ;; A&S
  453.  
  454.         (make-new-symbol generate-symbol)
  455.         (generate-uninterned-symbol generate-symbol)   ;; Good enough
  456.  
  457. ;; RRRS
  458.  
  459.         (complex? number?)      ;; ??
  460.         (exact? false)          ;; ??
  461.         (inexact? true)         ;; ??
  462.         (=? =)
  463.         (<? <)
  464.         (>? >)
  465.         (<=? <=)
  466.         (>=? >=)
  467.         (modulo mod)            ;; Close enough
  468.         (eqv? equiv?)           ;; Sort of
  469.         (list-ref nth)
  470.         (list-tail nthcdr)
  471.         (last-pair lastcdr)
  472.         (char=? char=)
  473.         (char<? char<)
  474.         (char>? char>)
  475.         (char<=? char<=)
  476.         (char>=? char>=)
  477.         (char-ci=? char=ic)
  478.         (char-ci<? char<ic)
  479.         (char-ci>? char>ic)
  480.         (char-ci<=? char<=ic)
  481.         (char-ci>=? char>=ic)
  482.         (char-alphabetic? alphabetic?)
  483.         (char-whitespace? whitespace?)
  484.         (char-upper-case? uppercase?)
  485.         (char-lower-case? lowercase?)
  486.         (char->integer char->ascii)
  487.         (integer->char ascii->char)
  488.         (string-null? string-empty?)
  489.         (string=? string-equal?)
  490.         (string-ref string-elt)
  491.         (string-fill! string-fill)
  492.         (string-copy copy-string)
  493.         (for-each walk)
  494.         (eof-object? eof?)
  495.         (current-input-port  standard-input)
  496.         (current-output-port standard-output)
  497.         (t-standard-env standard-env)
  498.         (environment-bind! *lset)
  499.     (environment-ref *value)
  500.     (environment-set! *set-value)
  501.  
  502.        ))
  503.  
  504. (walk (lambda (foo)
  505.          (*define scheme-env (car foo) (*value scheme-internal-env (cadr foo))))
  506.       scheme-aliased-from-t)
  507.  
  508. (*define scheme-env 'set-car! set-car!)
  509. (*define scheme-env 'set-cdr! set-cdr!)
  510. (*define scheme-env 'string-set! string-set!)
  511.  
  512. (define-scheme (close-input-port port)
  513.   (close port)
  514.   t)
  515.  
  516. (define-scheme (close-output-port port)
  517.   (close port)
  518.   t)
  519.  
  520. (define-scheme (substring-fill! string start end ch)
  521.   (let ((string (enforce string? string))
  522.         (ch (enforce char? ch)))
  523.     (let ((size (string-length string)))
  524.       (cond ((or (fx< end start)
  525.          (fx< start 0)
  526.          (fx>= end size))
  527.          (error "Bad index in ~S"
  528.             `(SUBSTRING-FILL! ,start ,end ,ch)))
  529.         (else
  530.          (do ((i start (fx+ i 1)))
  531.          ((fx> i end) string)
  532.            (set (nthchar string i) ch)))))))
  533.  
  534.  
  535. (define t-reset (*value t-implementation-env 't-reset))
  536.  
  537. ;;****************************************************************************
  538. 'SCHEME_RUNTIME
  539.